package com.tedu.api.map;
import org.junit.Test;

import java.util.*;
import java.util.function.BiConsumer;

/**包位置：java.util
 * Map顶级映射接口
 * 作用：一个元素由两个对象构成:分别键：Key与值：Value
 *       保存一个元素：Key---value【保存一对：‘两个对象】
 * 用途：通常与数据库搭配使用
 * 特点：键：无序，无下标，不可重复，实际存HashSet
 *      值：存泛型约束的类型，可以重复，实际存Collection
 * Map 接口对象创建---实现类
 * HashMap：【常用HashMap的方法与Map方法类型】出键值对组成，使用哈希算法实现！
 * 键与值可以为null，键中只允许一个null！
 * LinkedHashMap：【不常用：方法与HashMap类似】两端插入增强效率高
 * TreeMap：【不用】【算法：红黑树】性能：较低 ，线程安全！
 * HashMap：【不用】JDK1.0版本，由哈希算法实现，多线程问题
 * ConcurrentHashMap【常用】 多线程
 */
public class MapAPI {
    @Test
    public void testMap(){
        //创建Map映射集合接口
        Map<Object, String> map=new HashMap<>();
        /**
         * put(键K，值V)    返回值：V value---实际Collection
         */
        map.put("玛卡巴卡","隋欣宇");
        map.put("依古比古","王雪");
        map.put("小点点","潘瑞雪");
        map.put("飞飞🐟","大傻逼");
        map.put("依古比古","小傻逼");
        map.put(null,"无名氏");
        map.put(null,"无名氏");
        System.out.println("Map集合："+map);

        //需求：获取一组元素中值：”王雪“  get() 通过键找到值 返回值：V
        String lin=map.get("依古比古");
        System.out.println("通过键找值："+lin);
        //没有这个键，自动按照Collection对象，补对象默认：null
        System.out.println("通过键找值【键不存在】"+map.get("飞飞"));
        //删除元素中：键   remove(Key)   返回值：V value Collection
        map.remove("依古比古");
        System.out.println("Map集合："+map);
        //size()  获取映射集合的元素个数
        System.out.println("map集合元素总数："+map.size());

        //containsKey() 判断键是否存在  返回值：boolean
        //containsValue() 判断值是否存在  返回值：boolean
         boolean b=map.containsKey("玛卡巴卡");
        System.out.println("判断键是否存在："+b);
        boolean v=map.containsValue("大傻逼");
        System.out.println("判断键是否存在："+v);

    }
    /**
     * Map映射集合中； 一组键值对存入【一组元素：Entry】
     * 遍历映射集合：遍历所有的键，遍历所有的值，遍历所有的Entry
     *keySet：获取集合中所有的键
     * values：获取集合中所有的值
     * entrySet：获取集合中所有的[entry：键与值]
     */
    @Test
    public void testMaps(){
        Map<Object, String> map=new HashMap<>();
        map.put("SVT","金珉奎");
        map.put("BTS","田柾国");
        map.put("TXT","崔然竣");
        map.put("ZB1","沈泉锐");

        //keySet() 获取所有的值
        Set<Object> set=map.keySet();
        //遍历所有的键：增强for
        for(Object o:set){//从set集合中获取到所有键
            System.out.println("获取所有的键："+o);
        }
        //2.values() 获取所有值
        Collection<String> c=map.values();
        //遍历所有的值：增强for
        for(String s:c){
            System.out.println("获取所有值："+s);
        }
        //3.entrySet() 获取所有的Entry键值
        //返回值：Set<Map.Entry<K,V>>
        //Entry类型:Map.Entry<K,V>
        //Entry存键值的对象--Map增加一个针对键值的对象
        //Map.Entry  【Map接口.Entry内部接口对象】获取到表示所有的Entry的方法
        Set<Map.Entry<Object, String>> sets=map.entrySet();
        //获取键值对【entry】键值对
        for(Map.Entry<Object, String> s:sets){
          //  System.out.println("所有的entry："+s);
            //Entry中 Key 与Value方法：getKey() getValue()
            String key= (String) s.getKey();
            String value=s.getValue();
            System.out.println("打印Entry中键与值"+key+""+value);
        }
    }
    /**
     * forEach(new BiConsumer())
     * BiConsumer 接口 ----封装了
     */
    @Test
    public void testForEach(){
        Map<Object, String> map=new HashMap<>();
        map.put("SVT","金珉奎");
        map.put("BTS","田柾国");
        map.put("TXT","崔然竣");
        map.put("ZB1","沈泉锐");
        //forEach(接口)遍历映射集合：键与值
        map.forEach(new BiConsumer<Object,String>(){
            //accept(K,V)  获取Entry中所有的键和值
            public void accept(Object o, String s) {
                System.out.println("所有的键："+o);
                System.out.println("所有的值："+s);
            }
        });
    }

    /**
     * putIfAbsent()
     * 作用： 存一组entry，先判断指定的键是否存在，不存在将键值插入
     *                                       存在键值不插入
     */
    @Test
    public void testHashMap(){
        Map<Object, String> map=new HashMap<>();
        map.put("玛卡巴卡","隋欣宇");
        map.put("依古比古","王雪");
        map.put("小点点","潘瑞雪");
        map.put("飞飞🐟","大傻逼");
        map.put("玛卡巴卡","哇哇");
        map.putIfAbsent("花园宝宝","嘻嘻");
        map.putIfAbsent("汤不里唔不","哈哈");//相同键 不插入
        System.out.println("HashMap集合："+map);
    }

}

